package com.jrx.anytxn.customer.service;

import com.jrx.anytxn.common.exception.TxnBizException;
import com.jrx.anytxn.common.exception.TxnException;
import com.jrx.anytxn.customer.bean.CustomerInfoCreationBean;
import com.jrx.anytxn.customer.bean.MarketingRecordCreationBean;
import com.jrx.anytxn.customer.dto.BaseApiReq;
import com.jrx.anytxn.customer.dto.customer.*;
import com.jrx.anytxn.customer.entity.CmCustomerExtInfo;
import com.jrx.anytxn.customer.entity.CmCustomerFirstLevel;
import com.jrx.anytxn.customer.entity.CmCustomerSecondLevel;
import com.jrx.anytxn.customer.entity.TlMarketingRecord;

import java.util.ArrayList;
import java.util.List;

/**
 * 客户信息管理的服务接口
 *
 * @author liy
 * Date 2019/7/19
 * @version V1.0
 */
public interface ICustomerService {
    /**
     * 客户建档
     *
     * @param customerOperationBean 客户建档信息 整合后处理数据库的bean
     */
    void saveInfo(CustomerInfoCreationBean customerOperationBean) throws Exception;


    /**
     * 注册客户
     *
     * @param customerOperationBean 注册客户 整合后处理数据库的bean
     */
    void registerInfo(CustomerInfoCreationBean customerOperationBean) throws TxnBizException;

    /**
     * 根据客户ID和渠道ID查询二级客户信息   或不存在
     *
     * @param userId   用户id
     * @param channel  渠道
     * @param tenantId 租户id
     * @return CustomerSecondLevelRes 客户二级表响应实体
     */
    CustomerSecondLevelRes getByUserIdAndChannel(String userId, String channel, String tenantId) throws TxnBizException;


    /**
     * 修改账单日信息
     *
     * @param customerId     客户号
     * @param organizationId 机构ID
     * @param channel        渠道号
     * @param statementDd    账单日
     * @param tenantId       租户id
     * @return java.lang.Boolean
     * @author fan.yang
     * date: 2019/9/25 0025 下午 13:45
     */
    void editByUserIdAndOrgIdAndChannel(String customerId, String organizationId, String channel, Integer statementDd, String tenantId) throws TxnBizException;

    /**
     * 修改还款日信息
     *
     * @param customerId     客户号
     * @param organizationId 机构ID
     * @param channel        渠道号
     * @param statementDd    账单日
     * @param tenantId       租户id
     * @return java.lang.Boolean
     * @author fan.yang
     * date: 2019/9/25 0025 下午 13:45
     */
    void editPaymentDd(String customerId, String organizationId, String channel, Integer statementDd, String tenantId) throws TxnBizException;

    /**
     * 根据渠道和customerId获取客户的一级表，二级表信息
     *
     * @param channel  渠道号
     * @param userId   用户Id
     * @param tenantId 租户id
     * @return 客户一级表，二级表
     * @throws TxnBizException 不存在或数据异常
     */
    CustomerRes getCustomerByChannelAndUserId(String channel, String userId, String tenantId) throws TxnBizException;

    /**
     * 获取客户全部信息（基本信息+渠道+地址+联系人）
     *
     * @param baseApiReq 请求信息
     * @return 客户所有信息
     */
    CustomerWholeInfoRes customerInfoQuery(BaseApiReq baseApiReq) throws TxnBizException;

    /**
     * 根据核心客户编号获取客户信息
     *
     * @param firsetLeverQueryReq 请求信息
     * @return 客户一级客户信息
     */
    CustomerWholeInfoRes customerFirstLeverQuery(CustomerFirstLeverQueryReq firsetLeverQueryReq) throws TxnBizException;

    /**
     * 修改客群
     *
     * @param req 修改客群请求
     * @return 修改客群是否成功标记
     */
    void customerGroupInfoUpdate(ModifyCustomerGroupReq req) throws TxnBizException;

    /**
     * 获取客户基本信息列表
     *
     * @param mobile   手机号
     * @param idNo     证件号
     * @param tenantId 租户id
     * @return ArrayList
     */
    List<CustomerPageRes> getCustomerList(String mobile, String idNo, String tenantId, String name, String userId, String customerId) throws TxnBizException;

    /**
     * 根据手机号或者证件号获取客户一级信息列表
     *
     * @param mobile   手机号
     * @param idNo     证件号
     * @param tenantId 租户id
     * @return ArrayList
     */
    List<CmCustomerFirstLevel> getCustomerList(String mobile, String idNo, String tenantId) throws TxnBizException;

    /**
     * 获取客户联系人列表
     *
     * @param channel    渠道
     * @param customerId 客户id
     * @param tenantId   租户id
     * @return ArrayList 客户联系人集合
     */
    ArrayList<ContactInfoRes> getContactList(String channel, String customerId, String tenantId);

    /**
     * 获取客户地址信息列表
     *
     * @param channel    渠道
     * @param customerId 客户id
     * @param tenantId   租户id
     * @return ArrayList 客户地址信息集合
     */
    ArrayList<AddressInfoRes> getAddressList(String channel, String customerId, String tenantId);

    /**
     * 获取客户单位信息
     *
     * @param channel    渠道
     * @param customerId 客户ID
     * @param tenantId   租户ID
     * @return java.util.ArrayList<com.jrx.anytxn.customer.dto.customer.CompanyInfoRes>
     * @author fan.yang
     * date: 2020/1/8 0008 下午 17:26
     */
    ArrayList<CompanyInfoRes> getCompanyList(String channel, String customerId, String tenantId);

    /**
     * 根据组织号，证件类型，证件号码查询客户一级信息
     *
     * @param idNumber       证件号
     * @param idType         证件类型
     * @param organizationId 机构号
     * @param tenantId       租户id
     * @return com.jrx.anytxn.customer.dto.CustomerFirstLevelRes 客户一级信息
     * @author Qingyao Xing
     * @date 2019/8/8 10:20
     */
    CustomerFirstLevelRes getCustomerByOrgIdAndIdCard(String idNumber, String idType, String organizationId, String tenantId) throws TxnException;

    /**
     * 根据客户id和机构号查询客户一级信息
     *
     * @param customerId     客户id
     * @param organizationId 机构号
     * @param tenantId       租户id
     * @return com.jrx.anytxn.customer.dto.CustomerFirstLevelRes 客户一级表信息
     * @author Qingyao Xing
     * @date 2019/8/8 10:20
     */
    CustomerFirstLevelRes getFirstLevelByOrgIdAndCusId(String customerId, String organizationId, String tenantId) throws TxnException;

    /**
     * 获取一级客户信息
     * 内部调用使用 禁止controller直接调用
     *
     * @param customerId     客户id
     * @param organizationId 机构信息
     * @param tenantId       租户id
     * @return 一级信息
     * @throws TxnBizException 自定义异常
     */
    CmCustomerFirstLevel getFirstLevelByCondition(String customerId, String organizationId, String tenantId) throws TxnBizException;

    /**
     * 根据核心客户编号获取一级客户信息
     * 内部调用使用 禁止controller直接调用
     *
     * @param tenantId       租户id
     * @param ecifId 机构信息
     * @return 一级信息
     * @throws TxnBizException 自定义异常
     */
    CmCustomerFirstLevel getFirstLevelByEcifId(String tenantId, String ecifId) throws TxnBizException;

    /**
     * 获取一级客户信息（使用证件类型及证件号兜底验证）
     * 内部调用使用 禁止controller直接调用
     *
     * @param customerId     客户id
     * @param organizationId 机构信息
     * @param tenantId       租户id
     * @param idType         证件类型
     * @param idNo           证件号
     * @return 一级信息
     */
    CmCustomerFirstLevel getFirstLevelByCondition(String customerId, String organizationId, String tenantId, String idType, String idNo);

    /**
     * 获取二级客户信息
     * 内部调用使用 禁止controller直接调用
     *
     * @param userId   用户号
     * @param channel  渠道
     * @param tenantId 租户id
     * @param productId 产品编号
     * @return 客户二级信息
     * @throws TxnBizException 自定义异常
     */
    CmCustomerSecondLevel getSecondLevelByCondition(String userId, String channel, String tenantId, String productId) throws TxnBizException;

    /**
     * 根据渠道 租户id，客户id获取客户一二级表信息
     *
     * @param channel
     * @param customerId
     * @param tenantId
     * @return
     */
    CustomerRes getCustomerByChannelAndCustomerIdAndTensnId(String channel, String customerId, String tenantId) throws TxnBizException;

    /**
     * 获取二级客户信息
     * 内部调用使用 禁止controller直接调用
     *
     * @param channel    渠道
     * @param customerId 用户号
     * @param tenantId   租户id
     * @param productId  产品编号
     * @return 客户二级信息
     * @throws TxnBizException 自定义异常
     */
    CmCustomerSecondLevel getSecondByChannelAndCustomerIdAndTensnId(String channel, String customerId, String tenantId, String productId) throws TxnBizException;


    /**
     * 获取二级客户信息
     * 内部调用使用 禁止controller直接调用
     *
     * @param customerId 用户号
     * @param tenantId   租户id
     * @return 客户二级信息
     * @throws TxnBizException 自定义异常
     */
    List<CmCustomerSecondLevel> getSecondByCustomerIdAndTensnId(String customerId, String tenantId) throws TxnBizException;

    /**
     * 获取身份信息
     *
     * @param channel    渠道
     * @param customerId 客户ID
     * @param tenantId   租户ID
     * @return java.util.ArrayList<com.jrx.anytxn.customer.dto.customer.CustomerWholeInfoRes>
     * @author fan.yang
     * date: 2020/4/8 0008 下午 18:24
     */
    ArrayList<CustomerWholeInfoRes> getIdentityByChannelAndCustomerIdAndTenId(String channel, String customerId, String tenantId) throws TxnBizException;

    /**
     * 管理平台修改客群信息
     *
     * @param customerId
     * @param channel
     * @param tenantId
     * @param customerGroup
     * @param alterReason
     * @throws TxnBizException
     */
    void customerGroupInfoUpdateByCms(String customerId, String channel, String tenantId, String customerGroup, String alterReason) throws TxnBizException;

    /**
     * 修改客户手机号
     *
     * @param userId
     * @param tenantId
     * @param channel
     * @param mobile
     * @throws TxnBizException
     */
    void customerMobileUpdate(String userId, String tenantId, String channel, String mobile) throws Exception;

    /**
     * 保存营销记录
     *
     * @param marketingRecordCreationBean
     * @throws TxnBizException
     */
    TlMarketingRecord generateMarketingRecord(MarketingRecordCreationBean marketingRecordCreationBean) throws TxnBizException;

    /**
     * 修改客户证件有效期
     *
     * @param
     * @throws TxnBizException
     */
    void customerIdUpdate(CmCustomerFirstLevel customerFirstLevel) throws TxnBizException;

    CmCustomerSecondLevel getSecondByMobileAndTenantId(String mobile, String tenantId) throws TxnBizException;

    /**
     * 验证身份证有效期，并尝试更新
     * @param firstLevel
     * @param nextMonthDay
     */
    void validIdCard(CmCustomerFirstLevel firstLevel, String nextMonthDay);

    /**
     * 验证身份证有效期
     * @param req
     * @return
     * @throws TxnBizException
     */
    CustomerWholeInfoRes validCard(BaseApiReq req) throws TxnBizException;

    /**
     * 补充二类户开户时联网核查
     */
    void internetCheckAgain();

    /**
     * 注册ECIF
     * @param customerOperationBean
     * @throws Exception
     */
    void saveEcif(CustomerInfoCreationBean customerOperationBean) throws Exception;

    /**
     * 客户额外信息补充修改
     * @param req
     * @return
     */
    CmCustomerExtInfo extInfo(CusExtInfoReq req) throws TxnBizException;

    /**
     * 客户基础信息查询
     * 信息包含：核心客编、开户行、客户经理
     * @param req
     * @return
     */
    CustomerBaseInfoRes customerBaseInfoQuery(BaseApiReq req) throws TxnBizException;

    /**
     * 根据客户id修改客户手机号
     * @param req
     * @return
     */
    void customerMobileUpdateByCms(CustomerMobileUpdateByCmsReq req) throws TxnBizException;
}
